package com.cskaoyan.javase.oop.statickeyword7.introduction1;

/**
 * @description: 引入static关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 练习：
 * 	创建一个学生类，用来描述我们班全体同学，要求
 * 		属性：姓名，性别，年龄，学号，学校信息
 * 		行为：吃饭，学习
 *  对于我们班的童鞋来说,学校都是王道训练营,我不想每次创建对象都加上这五个字,我应该怎么办?
 *  最简单的方法就是给schoolName在定义时加上默认值
 *  思考一下:这样有什么问题? 这样浪费空间
 *
 *  于是我们在内存当中，找一片全体对象共享的区域来装这个属性
 *  这个区域在哪里？
 *  jdk7之前，jvm设计，把这个区域放在方法区当中，以后放进了堆空间当中
 *  但是为了我们上课方便画图，我们统一画在方法区，不必要纠结细节，理解原理
 *
 *  在jvm方法区当中，开辟了空间，称之为静态区
 *  用来存放“那些不是对象所有，而是全体对象共享的东西或者说属于类的东西”
 *  所以，静态区的东西分为两类：静态成员变量，静态成员方法，统称静态成员
 *
 *  语法：
 *      静态成员变量：static修饰的普通成员变量
 *      静态成员方法：static修饰的普通成员方法，main方法，“加static的方法”
 *  *
 */
public class Demo {
    public static void main(String[] args) {
        //创建这个类的对象
        Student s1 = new Student("张三");
        Student s2 = new Student("李四");
        Student s3 = new Student("王二");

        System.out.println(s1.schoolName);
        s1.schoolName = "C++训练营";
        System.out.println(s2.schoolName);
        System.out.println(s3.schoolName);
    }
}

class Student {
    String name;
    String gender;
    int age;
    int stuId;
    //既然学校都是王道训练营,我在这个类的属性定义的时候就给schoolName一个直接的初始值
    String schoolName = "王道训练营";

    //行为 吃饭和学习
    public void eat() {
        System.out.println("除了学习，就是吃饭！");
    }

    public void study() {
        System.out.println("除了吃饭，就是学习！");
    }

    //提供构造方法


    public Student() {
    }

    public Student(String name, String schoolName) {
        this.name = name;
        this.schoolName = schoolName;
    }

    public Student(String name) {
        this.name = name;
    }
}